package org.apache.examples.struts.actions.data;
import com.jayway.jsonpath.JsonPath;
import com.opensymphony.xwork2.ActionProxy;
import org.apache.examples.struts.models.Order;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsRestTestCase;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletResponse;
import java.util.List;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
public class OrderControllerTest extends StrutsRestTestCase<OrderController> {
@Before
public void init() throws Exception {
super.setUp();
}
@Test
public void testIndex() throws Exception {
ActionProxy proxy = getActionProxy("GET", "/data/order.json");
proxy.execute();
OrderController orderController = (OrderController) proxy.getAction();
Object model = orderController.getModel();
assertThat(model, notNullValue());
assertThat(model, is(instanceOf(List.class)));
List<Order> orders = (List<Order>) model;
assertThat("List contains 3 orders", orders.size(), is(greaterThanOrEqualTo(3)));
}
@Test
public void testShow() throws Exception {
ActionProxy proxy = getActionProxy("GET", "/data/order/3.json");
OrderController orderController = (OrderController) proxy.getAction();
orderController.setId("3");
proxy.execute();
Object model = orderController.getModel();
assertThat(model, notNullValue());
assertThat(model, is(instanceOf(Order.class)));
Order order = (Order) model;
assertThat(order.getClientName(), is(equalTo("Bob")));
assertThat(order.getAmount(), is(equalTo(33)));
}
@Test
public void testShowResult() throws Exception {
String result = executeAction("GET", "/data/order/3.json");
assertThat(JsonPath.read(result, "$.id"), is(equalTo("3")));
assertThat(JsonPath.read(result, "$.clientName"), is(equalTo("Bob")));
assertThat(JsonPath.read(result, "$.amount"), is(equalTo(33)));
}
@Test
public void testDelete() throws Exception {
request.setParameter("request_locale", "en");
ActionProxy proxy = getActionProxy("DELETE", "/data/order/3.json");
String result = proxy.execute();
assertThat(result, nullValue());
assertThat(ServletActionContext.getResponse().getContentType(), is(equalTo("application/json;charset=UTF-8")));
String jsonResult = ((MockHttpServletResponse) ServletActionContext.getResponse()).getContentAsString();
assertThat(JsonPath.read(jsonResult, "$.actionError"), is(equalTo("Delete is currently not supported!")));
assertThat(ServletActionContext.getResponse().getStatus(), is(equalTo(400)));
}
@Test
public void testValidation() throws Exception {
request.setParameter("clientName", "");
request.setParameter("amount", "1");
request.setParameter("request_locale", "en");
ActionProxy proxy = getActionProxy("POST", "/data/order.json");
OrderController orderController = (OrderController) proxy.getAction();
proxy.execute();
assertThat(ServletActionContext.getResponse().getStatus(), is(equalTo(406)));
assertThat(orderController.hasFieldErrors(), is(true));
assertThat(orderController.getFieldErrors().size(), is(2));
assertThat(orderController.getFieldErrors().get("amount").get(0), is(equalTo("Order amount needs to be between 10 and 666")));
assertThat(orderController.getFieldErrors().get("clientName").get(0), is(equalTo("Client name can not be blank")));
}
@Test
public void testCreate() throws Exception {
request.setParameter("clientName", "Grace Hopper");
request.setParameter("amount", "85");
ActionProxy proxy = getActionProxy("POST", "/data/order.json");
OrderController orderController = (OrderController) proxy.getAction();
proxy.execute();
assertThat(orderController.hasFieldErrors(), is(false));
Object model = orderController.getModel();
assertThat(model, notNullValue());
assertThat(model, is(instanceOf(Order.class)));
Order order = (Order) model;
assertThat(order.getClientName(), is(equalTo("Grace Hopper")));
assertThat(order.getAmount(), is(equalTo(85)));
}
}